//配置路由的文件
import Vue from "vue";
import VueRouter from "vue-router";
//使用插件
Vue.use(VueRouter);

import routes from './routes'

//引入store
import store from '@/store'
//先把VueRouter原型对象的push，先保存一份
let originPush = VueRouter.prototype.push
let originReplace = VueRouter.prototype.replace

//重写push|replace
//第一个参数：告诉原来push方法，你往哪里跳转（传递哪些参数）
//第二个参数：成功的回调
//第一个参数：失败的回调

VueRouter.prototype.push = function (location, resolve, reject) {
    if (resolve && reject) {
        //ca11 || app1y区别
        //相同点， 都可以调用函数- 一次，都可以篡改函数的 上下文一.次
        //不痛点: call与apply传递 参数: call传递 参数用逗号隔开，apply方法执行， 传递数组
        originPush.call(this, location, resolve, reject);
    } else {
        originPush.call(this, location, () => { }, () => { })
    }
}
VueRouter.prototype.replace = function (location, resolve, reject) {
    if (resolve && reject) {
        //ca11 || app1y区别
        //相同点， 都可以调用函数- 一次，都可以篡改函数的 上下文一.次
        //不同点: call与apply传递 参数: call传递 参数用逗号隔开，apply方法执行， 传递数组
        originReplace.call(this, location, resolve, reject);
    } else {
        originReplace.call(this, location, () => { }, () => { })
    }
}

//配置路由
let router = new VueRouter({
    //配置路由
    routes,
    //滚动行为
    scrollBehavior(to, from, savePosition) {
        //返回的y代表滚动条在最上方
        return { y: 0 }
    }
});

//全局守卫：前置守卫(在路由跳转之前进行判断)
router.beforeEach(async (to, from, next) => {
    //to:获取要跳转目标的路由信息
    //from：获取从哪个路由来的信息
    //next：放行函数
    // next()
    let token = store.state.user.token
    //用户信息
    let name = store.state.user.userInfo.name
    //用户登陆了，才会有token
    if (token) {
        //用户登陆后不能再去login
        if (to.path == '/login') {
            next('/home')
        } else {
            //已经登录，跳转非login页面
            //如果用户名已有
            if (name) {
                next()
            } else {
                //没有用户信息，派发action让仓库存储用户信息再跳转
                try {
                    //获取用户信息成功
                    await store.dispatch('getUserInfo')
                    next()
                } catch (error) {
                    //token失效
                    await store.dispatch('userLogout');
                    next('/login')
                }
            }
        }
    } else {
        //未登录不应去交易、支付、个人中心相关页面
        let toPath = to.path
        if(toPath.indexOf('/trade') != -1 || toPath.indexOf('/pay') != -1 || toPath.indexOf('/center') != -1){
            //把登陆之前想去的路由地址存储于地址栏中
            next('/login?redirect='+toPath)
        }else{
            //去的不是未登录禁止访问的页面
            next()
        }
    }
})

export default router